package com.curricula.usuario.action;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;

import com.curricula.mensaje.vo.MsgVO;
import com.curricula.menu.service.MenuService;
import com.curricula.menu.vo.MenuVO;
import com.curricula.usuario.form.UsuarioForm;
import com.curricula.usuario.service.UsuarioService;
import com.curricula.usuario.vo.UsuarioVO;

/**
 * DispatchAction que controla las altas bajas y cambios en la tabla de USUARIO.
 * 
 * @author Carlos
 * @category Class Action
 * 
 */
public class UsuarioAction extends DispatchAction {
	ActionForward forward = null;
	MsgVO msg = new MsgVO();

	static Logger log = Logger.getLogger(UsuarioAction.class);

	/**
	 * Inicia la sesion del usuario en el sistema buscando
	 * el usuario en la tabla curricula.usuario
	 * 
	 * @author Carlos
	 * @param ActionMapping mapping
	 * @param ActionForm form
	 * @param HttpServletRequest request
	 * @param HttpServletResponse response
	 * @return mapping.findForward forward
	 */
	public ActionForward loginUsuario(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response ){
		try {
			HttpSession sesion = request.getSession();
			UsuarioForm usuarioForm = (UsuarioForm) form;
			UsuarioVO buscado = new UsuarioVO();
			BeanUtils.copyProperties(buscado, usuarioForm);
			UsuarioVO encontrado = null;
			
			MenuVO menuVO = new MenuVO();
			List<MenuVO> menu = new ArrayList<MenuVO>();
						
			encontrado = UsuarioService.busca(buscado);
			if(encontrado != null){				
				menuVO.setMenTipo(encontrado.getUsrTipo());
				menuVO.setMenSeccion("menu");
				menu = MenuService.getMenu(menuVO);
				sesion.setAttribute("menu", menu);
				
				menuVO.setMenTipo(encontrado.getUsrTipo());
				menuVO.setMenSeccion("menuC");
				menu = MenuService.getMenu(menuVO);
				sesion.setAttribute("menuC", menu);
				
				menuVO.setMenTipo(encontrado.getUsrTipo());
				menuVO.setMenSeccion("menuP");
				menu = MenuService.getMenu(menuVO);
				sesion.setAttribute("menuP", menu);
				
				menuVO.setMenTipo(encontrado.getUsrTipo());
				menuVO.setMenSeccion("menuU");
				menu = MenuService.getMenu(menuVO);
				sesion.setAttribute("menuU", menu);
				
				sesion.setAttribute("usuarioVO", encontrado);
				forward = mapping.findForward("inicio");
			}
			else{
				msg.setMsgTipo("registro");
				msg.setMsgTitulo("Usuario no Registrado");
				msg.setMsgDescripcion("El usuario o password introducido no es correcto favor de verificarlo o registrar una cuenta.");				
				request.setAttribute("msgVO", msg);
				forward = mapping.findForward("inicio");
			}			
		} catch (SQLException e) {
			MsgVO msgbd = new MsgVO("bd", e);
			request.setAttribute("msgVO", msgbd);				
			forward = mapping.findForward("inicio");
		} catch (Exception e) {
			MsgVO msgerror = new MsgVO("error", e);
			request.setAttribute("msgVO", msgerror);				
			forward = mapping.findForward("inicio");
		}
		return forward;
	}
	
	/**
	 * Obtiene los registros de la tabla curricula.usuario para verificar
	 * que el usurio existe en la BD
	 * 
	 * @author Carlos
	 * @param ActionMapping mapping
	 * @param ActionForm form
	 * @param HttpServletRequest request
	 * @param HttpServletResponse response
	 * @return mapping.findForward forward
	 */
	public ActionForward getUsuario(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response ){
		try {
			UsuarioVO buscado = new UsuarioVO();
			buscado.setUsrId(Integer.parseInt(request.getParameter("id")));
			UsuarioVO encontrado = null;
						
			encontrado = UsuarioService.busca(buscado);
			if(encontrado != null){
				request.setAttribute("usuario", encontrado);
				forward = mapping.findForward("modificar");
			}
			else{
				msg.setMsgTipo("registro");
				msg.setMsgTitulo("Usuario no Registrado");
				msg.setMsgDescripcion("El usuario o password introducido no es correcto favor de verificarlo o registrar una cuenta.");				
				request.setAttribute("msgVO", msg);
				forward = mapping.findForward("modificar");
			}			
		} catch (SQLException e) {
			MsgVO msgbd = new MsgVO("bd", e);
			request.setAttribute("msgVO", msgbd);				
			forward = mapping.findForward("modificar");
		} catch (Exception e) {
			MsgVO msgerror = new MsgVO("error", e);
			request.setAttribute("msgVO", msgerror);				
			forward = mapping.findForward("modificar");
		}
		return forward;
	}
	
	/**
	 * Agrega un usuario nuevo en la base de datos
	 * tabla curricula.usuario
	 * 
	 * @author Carlos
	 * @param ActionMapping mapping
	 * @param ActionForm form
	 * @param HttpServletRequest request
	 * @param HttpServletResponse response
	 * @return mapping.findForward forward
	 */
	public ActionForward altaUsuario(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response ){
		try {
			UsuarioForm usuarioForm = (UsuarioForm) form;
			UsuarioVO usuarioVO = new UsuarioVO();
			List<UsuarioVO> usuarios = new ArrayList<UsuarioVO>();
			BeanUtils.copyProperties(usuarioVO, usuarioForm);
			HttpSession sesion = request.getSession();
			
			if(UsuarioService.alta(usuarioVO)){
				msg.setMsgTipo("informacion");
				msg.setMsgTitulo("Informacion registro");
				
				usuarioForm.reset(mapping, request);
				usuarios=UsuarioService.consulta(usuarioVO);
				request.setAttribute("accion", "consultaUsuario");
				sesion.setAttribute("usuariosList", usuarios);
				form.reset(mapping, request);
				
				if(sesion.getAttribute("usuarioVO")!=null)
				{
					forward = mapping.findForward("buscar");
					msg.setMsgDescripcion("El usuario se ha dado de alta correctamente.");				
					request.setAttribute("msgVO", msg);
				}
				else
				{
					forward = mapping.findForward("inicio");
					msg.setMsgDescripcion("Tu usuario y contrase�a se han registrado correctamente.");				
					request.setAttribute("msgVO", msg);
				}
			}else{
				msg.setMsgTipo("informacion");
				msg.setMsgTitulo("Usuario existente");
				msg.setMsgDescripcion("Ya existe un usuario con el usuario y/o password que desea agregar, seleccione otro nombre de usuario por favor.");				
				request.setAttribute("msgVO", msg);
				forward = mapping.findForward("registro");
			}
		} catch (SQLException e) {
			MsgVO msgbd = new MsgVO("bd", e);
			request.setAttribute("msgVO", msgbd);				
			forward = mapping.findForward("buscar");
		} catch (Exception e) {
			MsgVO msgerror = new MsgVO("error", e);
			request.setAttribute("msgVO", msgerror);				
			forward = mapping.findForward("buscar");
		}
		return forward;
	}
	
	/**
	 * Elimina un usuario existente de la base de datos
	 * de la tabla curricula.usuario
	 * 
	 * @author carlos
	 * @param ActionMapping mapping
	 * @param ActionForm form
	 * @param HttpServletRequest request
	 * @param HttpServletResponse response
	 * @return mapping.findForward forward
	 */
	public ActionForward bajaUsuario(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response ){
		try {
			UsuarioVO usuarioVO = new UsuarioVO();
			UsuarioVO buscar = new UsuarioVO();
			List<UsuarioVO> usuarios = new ArrayList<UsuarioVO>();
			HttpSession sesion = request.getSession();
			
			usuarioVO.setUsrId(Integer.parseInt(request.getParameter("id")));
			if(UsuarioService.baja(usuarioVO)){
				msg.setMsgTipo("informacion");
				msg.setMsgTitulo("Actualizacion correcta");
				msg.setMsgDescripcion(" El usuario se elimino correctamente.");				
				request.setAttribute("msgVO", msg);

				usuarios=UsuarioService.consulta(buscar);
				request.setAttribute("accion", "consultaUsuario");
				sesion.setAttribute("usuariosList", usuarios);
				
				forward = mapping.findForward("buscar");
			}else{
				msg.setMsgTipo("informacion");
				msg.setMsgTitulo("Actualizacion incorrecta");
				msg.setMsgDescripcion(" No se  se pudo eliminar el registro del usuario.");				
				request.setAttribute("msgVO", msg);
				forward = mapping.findForward("buscar");
			}
		} catch (SQLException e) {
			MsgVO msgbd = new MsgVO("bd", e);
			request.setAttribute("msgVO", msgbd);				
			forward = mapping.findForward("inicio");
		} catch (Exception e) {
			MsgVO msgerror = new MsgVO("error", e);
			request.setAttribute("msgVO", msgerror);				
			forward = mapping.findForward("inicio");
		}
		return forward;
	}

	/**
	 * Actualiza la informacion de un usuario existente en
	 * la base de datos tabla curricula.usuario
	 * 
	 * @author Carlos
	 * @param ActionMapping mapping
	 * @param ActionForm form
	 * @param HttpServletRequest request
	 * @param HttpServletResponse response
	 * @return mapping.findForward forward
	 */
	public ActionForward cambioUsuario(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response ){
		try {
			UsuarioForm usuarioForm = (UsuarioForm) form;
			UsuarioVO usuarioVO = new UsuarioVO();
			UsuarioVO usuarioVO2 = new UsuarioVO();
			List<UsuarioVO> usuarios = new ArrayList<UsuarioVO>();
			HttpSession sesion = request.getSession();
			
			BeanUtils.copyProperties(usuarioVO, usuarioForm);
			if(UsuarioService.cambio(usuarioVO)){
				msg.setMsgTipo("informacion");
				msg.setMsgTitulo("Actualizacion correcta");
				msg.setMsgDescripcion(" El usuario se actualizo correctamente.");
				request.setAttribute("msgVO", msg);
				
				if(request.getParameter("parent").toString().equals("MiCuenta"))
				{
					sesion.setAttribute("usuarioVO", usuarioVO);
					forward = mapping.findForward("inicio");
				}
				else
				{
					form.reset(mapping, request);
					usuarioVO2=(UsuarioVO) sesion.getAttribute("usuarioVO");
					if(usuarioForm.getUsrId()==usuarioVO2.getUsrId())
						sesion.setAttribute("usuarioVO", usuarioVO);
					usuarios=UsuarioService.consulta(usuarioVO);
					request.setAttribute("accion", "consultaUsuario");
					sesion.setAttribute("usuariosList", usuarios);
					forward = mapping.findForward("buscar");
				}
			}else{
				msg.setMsgTipo("informacion");
				msg.setMsgTitulo("Actualizacion incorrecta");
				msg.setMsgDescripcion(" No se  se pudo actualizar el registro del usuario.");				
				request.setAttribute("msgVO", msg);
				if(request.getParameter("parent").toString().equals("MiCuenta"))
					forward = mapping.findForward("inicio");
				else
					forward = mapping.findForward("buscar");
			}			
		} catch (SQLException e) {
			MsgVO msgbd = new MsgVO("bd", e);
			request.setAttribute("msgVO", msgbd);				
			forward = mapping.findForward("buscar");
		} catch (Exception e) {
			MsgVO msgerror = new MsgVO("error", e);
			request.setAttribute("msgVO", msgerror);				
			forward = mapping.findForward("buscar");
		}
		return forward;
	}
	
	/**
	 * Actualiza el registro de plantilla en la tabla curricula.usuario que sirve
	 * para presentar el curriculum en PDF con una cierta plantilla.
	 * 
	 * @author Carlos
	 * @param ActionMapping mapping
	 * @param ActionForm form
	 * @param HttpServletRequest request
	 * @param HttpServletResponse response
	 * @return mapping.findForward forward
	 */
	public ActionForward cambioPlantilla(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response ){
		try {
			UsuarioVO usuarioVO = new UsuarioVO();
			HttpSession sesion = request.getSession();
			
			usuarioVO=(UsuarioVO) sesion.getAttribute("usuarioVO");
			usuarioVO.setUsrPlantilla(Integer.valueOf(request.getParameter("usrPlantilla")));
			
			if(UsuarioService.cambio(usuarioVO)){
				
				sesion.setAttribute("usuarioVO", usuarioVO);

				msg.setMsgTipo("informacion");
				msg.setMsgTitulo("Actualizacion correcta");
				msg.setMsgDescripcion("La plantilla ha sido guardada correctamente.");
				request.setAttribute("msgVO", msg);
				
				forward = mapping.findForward("plantillas");
				
			}else{
				msg.setMsgTipo("informacion");
				msg.setMsgTitulo("Actualizacion incorrecta");
				msg.setMsgDescripcion(" No se pudo guardar la plantilla.");				
				request.setAttribute("msgVO", msg);
				forward = mapping.findForward("plantillas");
			}			
		} catch (SQLException e) {
			MsgVO msgbd = new MsgVO("bd", e);
			request.setAttribute("msgVO", msgbd);				
			forward = mapping.findForward("plantillas");
		} catch (Exception e) {
			MsgVO msgerror = new MsgVO("error", e);
			request.setAttribute("msgVO", msgerror);				
			forward = mapping.findForward("plantillas");
		}
		return forward;
	}
	
	/**
	 * Obtiene una lista con los usuarios que se encuentran
	 * en la base de datos tabla curricula.usuario
	 * 
	 * @author Carlos
	 * @param ActionMapping mapping
	 * @param ActionForm form
	 * @param HttpServletRequest request
	 * @param HttpServletResponse response
	 * @return mapping.findForward forward
	 */
	public ActionForward consultaUsuario(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response ){
		try {
			UsuarioForm usuarioForm = (UsuarioForm) form;
			UsuarioVO usuarioVO = new UsuarioVO();
			List<UsuarioVO> usuarios = new ArrayList<UsuarioVO>();
			HttpSession sesion = request.getSession();
			
			BeanUtils.copyProperties(usuarioVO, usuarioForm);
			if(UsuarioService.consulta(usuarioVO)!=null){
				usuarios=UsuarioService.consulta(usuarioVO);
				sesion.setAttribute("usuariosList", usuarios);
				forward = mapping.findForward("buscar");
			}else{
				usuarios=null;
				request.setAttribute("usuariosList", usuarios);
				msg.setMsgTipo("informacion");
				msg.setMsgTitulo("Sin Resultados en la busqueda");
				msg.setMsgDescripcion(" No se obtuvo ningun resulotado en la busqueda por favor selecciona otros criterios de busqueda.");				
				request.setAttribute("msgVO", msg);
				forward = mapping.findForward("buscar");
			}
		} catch (SQLException e) {
			MsgVO msgbd = new MsgVO("bd", e);
			request.setAttribute("msgVO", msgbd);				
			forward = mapping.findForward("buscar");
		} catch (Exception e) {
			MsgVO msgerror = new MsgVO("error", e);
			request.setAttribute("msgVO", msgerror);				
			forward = mapping.findForward("buscar");
		}
		return forward;
	}
	
	/**
	 * Cierra la sesion eliminando los atributos
	 * de sesion con los que se inicio
	 * 
	 * @author Carlos
	 * @param ActionMapping mapping
	 * @param ActionForm form
	 * @param HttpServletRequest request
	 * @param HttpServletResponse response
	 * @return mapping.findForward forward
	 */
	public ActionForward cerrarSesion(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response ){
		try {		
			HttpSession sesion = request.getSession();
			sesion.removeAttribute("usuarioVO");
			sesion.removeAttribute("msg");
			sesion.removeAttribute("menu");
			sesion.removeAttribute("menuC");
			sesion.removeAttribute("menuP");
			sesion.removeAttribute("menuU");
			sesion.invalidate();
		} catch (Exception e) {
			log.error("Error al cerrar sesion: "+e);
			MsgVO msgerror = new MsgVO("error", e);
			request.setAttribute("msgVO", msgerror);				
			forward = mapping.findForward("inicio");
		}
			return  mapping.findForward("inicio");			
	}	
	
}